package xkp.lesson5;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

import xkp.lesson1.Person;

public class Test反射 {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		Class<?> class1 = Class.forName("xkp.lesson1.Person");
		//通过Class对象获取构造方法、成员方法、成员变量，包括private修饰的也可以获取到
		//2、获取到之后使用
		
		//获取构造方法并调用
		//返回的是构造方法的数组，此时不包含private修饰的资源
		//Constructor[] constructors = class1.getConstructors();
		//如果想要把私有的资源也获取到
		Constructor<?>[] constructors = class1.getDeclaredConstructors();
		//增强型for循环
		for(Constructor<?> constructor:constructors) {
			System.out.println(constructor);
		}
		
		//单独获取无参构造方法,要求该无参构造方法应该是非private修饰
		//此处无参构造方法
		Constructor<?> constructor = class1.getConstructor(null);
		//调用该构造方法
		Person person = (Person) constructor.newInstance(null);
		System.out.println(person);
		
		//如何获取和调用有参构造方法
		//此处有两个参数
		Constructor<?> constructor2 = class1.getConstructor(int.class,String.class);
		Person person2 = (Person) constructor2.newInstance(100,"张三");
		System.out.println(person2);
		
		//如何调用私有构造方法
		//此处有一个参数，并且是private的
		Constructor<?> constructor3 = class1.getDeclaredConstructor(int.class);
		//对于私有的资源不能直接访问,此处可以直接允许访问
		constructor3.setAccessible(true);
		Person person3 = (Person) constructor3.newInstance(100);
		System.out.println(person3);
	}
}
